package ec.gob.magap.era.web.controller;
import java.io.Serializable;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import ec.gob.magap.era.entities.Recurso;
import ec.gob.magap.era.entities.Usuario;
import ec.gob.magap.era.web.general.Utilidades;

public class BasicoController implements Serializable{
	
	
	@SuppressWarnings("unchecked")
	@PostConstruct
    public void postContruct() {
	   
	  HttpSession session = Utilidades.getSession();
	  setUsuario((Usuario) session.getAttribute("UsuarioLogeado"));
	  setListaRecursos((List<Recurso>)  session.getAttribute("Recursos"));
    }
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -823098771253276642L;

	/**
	 * @return
	 */
	protected HttpServletRequest getHttpRequest() {
		return (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
	}

	/**
	 * @return
	 */
	protected HttpServletResponse getHttpResponse() {
		return (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
	}

	/**
	 * 
	 * @param param
	 * @return
	 */
	protected Object getPassedParameter(String param) {
		FacesContext facesContext = FacesContext.getCurrentInstance();
		return (Object) facesContext.getExternalContext().getRequestParameterMap().get(param);		
	}
	
	/**
	 * @return
	 */
	protected HttpSession getHttpSession() {
		return (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
	}

	/**
	 * @param summary
	 * @param detail
	 */
	protected void addErrorMessage(final String summary, final String detail) {
		FacesMessage errorMessage = new FacesMessage();
		errorMessage.setSummary(summary);
		errorMessage.setDetail(detail);
		errorMessage.setSeverity(FacesMessage.SEVERITY_ERROR);
		FacesContext.getCurrentInstance().addMessage(null, errorMessage);
	}

	/**
	 * @param summary
	 * @param detail
	 */
	protected void addInfoMessage(final String summary, final String detail) {
		FacesMessage infoMessage = new FacesMessage();
		infoMessage.setSummary(summary);
		infoMessage.setDetail(detail);
		infoMessage.setSeverity(FacesMessage.SEVERITY_INFO);
		FacesContext.getCurrentInstance().addMessage(null, infoMessage);
	}

	/**
	 * @param summary
	 * @param detail
	 */
	protected void addWarningMessage(final String summary, final String detail) {
		FacesMessage warningMessage = new FacesMessage();
		warningMessage.setSummary(summary);
		warningMessage.setDetail(detail);
		warningMessage.setSeverity(FacesMessage.SEVERITY_WARN);
		FacesContext.getCurrentInstance().addMessage(null, warningMessage);
	}
	
	protected String getUsuarioActual() {
		return this.getHttpRequest().getRemoteUser().toUpperCase();
	}
	
	public Long setLongNullToCero(Long Valor){
		if(Valor != null){
			return Valor;
		}
		return (long) 0;
	}
	
	public Double setDoubleNullToCero(Double Valor){
		if(Valor != null){
			return Valor;
		}
		return (double) 0;
	}
	
	public Date setDateNullToNewDate(Date Valor){
		if(Valor != null){
			return Valor;
		}
		return new Date();
	}
	
	public String setStringNullToEmpty(String Valor){
		if(Valor != null){
			return Valor;
		}
		return "";
	}
	/**
	 * Retorna el username del funcionario que se encuentra activo en el sistema
	 * @return
	 */
	public String getUsername() {
		return getHttpRequest().getRemoteUser().toUpperCase();
	}

	/**
	 * Retorna el nombre del servidor donde se ejecuta la aplicacion
	 * 
	 * @return
	 * @throws UnknownHostException
	 */
	public String getHostname() throws UnknownHostException {
		return InetAddress. getLocalHost().getHostName();
	}
	/**
	 * Selecciona el icono a mostrar de acuerdo al mensaje que se envia al cliente
	 * @return
	 */
	public String getMessagesIcon() {
		String icon = "/img/espacio.gif";
		if (FacesContext.getCurrentInstance().getMaximumSeverity() != null) {
			int maximumSeverityOrdinal = FacesContext.getCurrentInstance().getMaximumSeverity().getOrdinal();
			if (maximumSeverityOrdinal == FacesMessage.SEVERITY_ERROR.getOrdinal()) {
				icon = "/img/errorGrande.gif";
			} else if (maximumSeverityOrdinal == FacesMessage.SEVERITY_INFO.getOrdinal()) {
				icon = "/img/infoGrande.gif";
			} else if (maximumSeverityOrdinal == FacesMessage.SEVERITY_WARN.getOrdinal()) {
				icon = "/img/advertenciaGrande.gif";
			}
		}
		return icon;
	}

	/**
	 * Selecciona el estilo css de acuerdo al mensaje enviado al cliente
	 * @return
	 */
	public String getMessagesStyleClass() {
		if (FacesContext.getCurrentInstance().getMaximumSeverity() != null) {
			int maximumSeverityOrdinal = FacesContext.getCurrentInstance().getMaximumSeverity().getOrdinal();
			if (maximumSeverityOrdinal == FacesMessage.SEVERITY_ERROR.getOrdinal()) {
				return "errormessage";
			} else if (maximumSeverityOrdinal == FacesMessage.SEVERITY_INFO.getOrdinal()) {
				return "infomessage";
			} else if (maximumSeverityOrdinal == FacesMessage.SEVERITY_WARN.getOrdinal()) {
				return "warningmessage";
			}
		}
		return "messages-hidden";
	}
	
	public String direccionar()
	{
		String navegacion="";
		
		FacesContext context = FacesContext.getCurrentInstance();  
		Boolean esCatalogo = Boolean.parseBoolean( context.getExternalContext().getRequestParameterMap().get("esCatalogo"));
		navegacion = (String) context.getExternalContext().getRequestParameterMap().get("pagina");
		
		if(esCatalogo)
		{
			String  valorCatalogo = (String) context.getExternalContext().getRequestParameterMap().get("valorCatalogo");
			Utilidades.getSession().setAttribute("TipoCatalogo", valorCatalogo);
			Utilidades.getSession().setAttribute("UsuarioLogeado", getUsuario());
		}

		return navegacion;
	}
	private Usuario usuario;

	private List<Recurso> listaRecursos;
	
	/**
	 * @return the usuario
	 */
	public Usuario getUsuario() {
		return usuario;
	}

	/**
	 * @param usuario the usuario to set
	 */
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	/**
	 * @return the listaRecursos
	 */
	public List<Recurso> getListaRecursos() {
		return listaRecursos;
	}

	/**
	 * @param listaRecursos the listaRecursos to set
	 */
	public void setListaRecursos(List<Recurso> listaRecursos) {
		this.listaRecursos = listaRecursos;
	}
}
